package szad.org.model;

import java.util.List;
import java.util.Vector;

import szad.org.container.ConstantTexts;
import szad.org.dao.GsonResponse;
import szad.org.dao.Szakember;

public class Dao {
	private int n; // Tablameret
	public Mezo mezok[][]; // mezok tartalma

	public int getX(int c) {
		int i1, j1;
		
		i1 = c-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		return i1;
	}
	
	public int getY(int c) {
		int i1, j1;
		
		i1 = c-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		return j1;
	}
	
	public int coordToIndex(int x, int y) {
		return x*n + y+1;
	}
	
	public Mezo getMezo(int i, int j) {
		return mezok[i][j];
	}
	
	public Munka getMunka(int i, int j) {
		return mezok[i][j].munka;
	}
	
	public Dao(int n){
		this.n = n; // tablameret
		
		mezok = new Mezo[n][n];
		
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++){
				mezok[i][j] = new Mezo(i, j);
				
				if(j>0)
					mezok[i][j].setSzomszedTrue(0);
				else
					mezok[i][j].setSzomszedFalse(0);
				
				if(i<n)
					mezok[i][j].setSzomszedTrue(1);
				else
					mezok[i][j].setSzomszedFalse(1);
				
				if(j<n)
					mezok[i][j].setSzomszedTrue(2);
				else
					mezok[i][j].setSzomszedFalse(2);
				
				if(i>0)
					mezok[i][j].setSzomszedTrue(3);
				else
					mezok[i][j].setSzomszedFalse(3);
			}
	}
	
	public void setSzomszedFalse(int honnan, int hova){ // 1D tomb [1-n] elem
		int i1, j1, i2, j2;
		
		i1 = honnan-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		i2 = hova-1;
		j2 = 0;
		
		while(i2>=n){
			i2 -= n;
			j2++;
		}
		
		// 0-felso, 1-jobb, 2-also, 3-bal
		if(i1<i2){ // jobbra
			mezok[i1][j1].setSzomszedFalse(1);
			mezok[i2][j2].setSzomszedFalse(3);
		}else if(i1>i2){ // balra
			mezok[i1][j1].setSzomszedFalse(3);
			mezok[i2][j2].setSzomszedFalse(1);
		}else if(j1>j2){ // fel
			mezok[i1][j1].setSzomszedFalse(0);
			mezok[i2][j2].setSzomszedFalse(2);
		}else{ // le
			mezok[i1][j1].setSzomszedFalse(2);
			mezok[i2][j2].setSzomszedFalse(0);
		}
	}
	
	public boolean getSzomszed(int honnan, int hova){ // 1D tomb [1-n] elem
		int i1, j1, i2, j2;
		
		i1 = honnan-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		i2 = hova-1;
		j2 = 0;
		
		while(i2>=n){
			i2 -= n;
			j2++;
		}
		
		// 0-felso, 1-jobb, 2-also, 3-bal
		if(i1<i2){ // jobbra
			return mezok[i1][j1].getSzomszed(1);
		}else if(i1>i2){ // balra
			return mezok[i1][j1].getSzomszed(3);
		}else if(j1>j2){ // fel
			return mezok[i1][j1].getSzomszed(0);
		}else{ // le
			return mezok[i1][j1].getSzomszed(2);
		}
	}
	
	public void szakemberMozgat(int honnan, int hova){ // 1D tomb [1-n] elem
		int i1, j1, i2, j2;
		
		i1 = honnan-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		i2 = hova-1;
		j2 = 0;
		
		while(i2>=n){
			i2 -= n;
			j2++;
		}
		
		mezok[i2][j2].szakember = mezok[i1][j1].szakember;
		mezok[i1][j1].szakember = null;
	}
	
	public void szekhelyMozgat(int honnan, int hova){
		if(hova>=n || hova<0 || honnan>=n || honnan<0)
			return;
		
		int i1, j1, i2, j2;
		
		i1 = honnan-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		i2 = hova-1;
		j2 = 0;
		
		while(i2>=n){
			i2 -= n;
			j2++;
		}
		
		mezok[i2][j2].szekhely = mezok[i1][j1].szekhely;
		mezok[i1][j1].szekhely = null;
	}
	
	public void ujSzakember(int hova, String tipus, String id, String owner){
		if( hova<0)
			return;
		
		int i1, j1;
		
		i1 = hova-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		mezok[i1][j1].szakember = new Szakember(tipus, id, owner);
	}
	public int getMapSize() {
		return n;
	}
	
	public void setMunka(int koord, String type, int duration, int remaming, int progit, int penalty, String status){
		if(koord>=n || koord<0)
			return;
		
		int i1, j1;
		
		i1 = koord-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		mezok[i1][j1].munka = new Munka(koord, type, duration, remaming, progit, penalty, status);
	}
	
	public Mezo getSzekhely(int koord) {
		if(koord<0)
			return null;
		
		int i1, j1;
		
		i1 = koord-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
			return mezok[i1][j1];

	}
	
	public void setSzekhely(int koord, String owner){
		if(koord<0)
			return;
		
		int i1, j1;
		
		i1 = koord-1;
		j1 = 0;
		
		while(i1>=n){
			i1 -= n;
			j1++;
		}
		
		mezok[i1][j1].szekhely = new Szekhelyek(owner, koord);
	}
	
	public int getN(){
		return n;
	}
	
	public Vector<Munka> getNemElvegzettMunka() {
	    Vector<Munka> munkak = new Vector<Munka>();
	    
	    for(int i=0;i<n;i++)
	    	for(int j=0;j<n;j++)
	    		if(mezok[i][j].munka != null)
	    			if(mezok[i][j].munka.getStatus().equals("completed"))
	    				munkak.add(mezok[i][j].munka);
	    
	    return munkak;   
	}
	
	public void getElvegzettMunkak(GsonResponse gsresp) {
        GsonResponse.Task[] tasks = gsresp.tasks ;
        
        for(int i=0;i<tasks.length;i++) { 
        	if(tasks[i].status.equals("completed")){
        		if(!ConstantTexts.elvegzettMunkak.contains(tasks[i])){
        			Munkak m = new Munkak(tasks[i].coordinate, tasks[i].type, tasks[i].duration, tasks[i].remaining, tasks[i].profit, tasks[i].penalty, tasks[i].status);
        			ConstantTexts.elvegzettMunkak.add(m);
        		}
        	}
    	}
	}	
}
